<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 基础的构造函数
        // "高级"版本的构造函数     --- 在基础版本上增加了一些新的属性或者方法



        // 一个'类' 由两部分构成的  构造函数  + prototype



        // 第一种继承：原型链继承  --- 让子类的prototype 指向父类的实例化对象
        // const d = new Dog('cc') ;   // d身上既有构造函数的属性，又有prptotype上的方法

        // KeJi.prototype = new Dog('cc') ;


        // 第二种  只继承构造函数那一部分    --- 可以向父类传参
        //    prototype上的方法无法继承

        // function Dog (name , age) {
        //     this.name = name ; 
        //     this.age = age ;
        // }



        // function KeJi(name , age , color) {
        //     this.color = color ;

        //     // this.name = name ; 
        //     // this.age = age ;

        //     Dog.call(this ,name , age)
        // }



        // 第三种组合继承  ：构造函数继承 + prototype

        function Dog (name , age) {
            this.name = name ; 
            this.age = age ;
        }

        Dog.prototype.say = function() {
            
        }


        // function ff() {
        //     function KeJi(name , age , color) {
        //         this.color = color ;

        //         // this.name = name ; 
        //         // this.age = age ;

        //         Dog.call(this ,name , age)
        //     }

        //     // KeJi.prototype = Dog.prototype ;

        //     // for(let k in Dog.prototype) {
        //     //     KeJi.prototype[k] = Dog.prototype[k]
        //     // }

        //     // KeJi.prototype = {...Dog.prototype} ;

        //     借用第三者去继承父类prototype上的方法
        //     function Fn() {}  // 没有属性
        //     Fn.prototype = Dog.prototype 

        //     const f = new Fn() ;  // f只有父类的方法

        //     KeJi.prototype = f ;

        //     return KeJi ;   // 构造函数
        // }

        // const KeJi = ff();


        const KeJi = (function(){
            function KeJi(name , age , color) {
                this.color = color ;

                // this.name = name ; 
                // this.age = age ;

                Dog.call(this ,name , age)
            }

            function Fn() {}  // 没有属性
            Fn.prototype = Dog.prototype 

            const f = new Fn() ;  // f只有父类的方法

            KeJi.prototype = f ;

            return KeJi ;   // 构造函数
        })() ;



      const k = new KeJi('旺财' , 2 , '白色') ;
      console.log(k);




    </script>
    
</body>
</html>